<#--<template>-->
<#--  <div class="container">-->
<#--    <div class="handle">-->
<#--      <n-button-group class="button-group" size="small">-->
<#--        <n-button type="info" @click="drawerShow = !drawerShow">-->
<#--          <template #icon>-->
<#--            <n-icon>-->
<#--              <CarbonSearch />-->
<#--            </n-icon>-->
<#--          </template>-->
<#--          <template #default>搜索</template>-->
<#--        </n-button>-->
<#--      </n-button-group>-->
<#--      <n-button-group class="button-group" size="small">-->
<#--        <n-button type="success" @click="showModal('add')">-->
<#--          <template #icon>-->
<#--            <n-icon>-->
<#--              <FaPlusSquareRegular />-->
<#--            </n-icon>-->
<#--          </template>-->
<#--          <template #default>添加</template>-->
<#--        </n-button>-->
<#--        <n-button-->
<#--          type="warning"-->
<#--          @click="showModal('edit')"-->
<#--          :disabled="modelKeys.length != 1"-->
<#--        >-->
<#--          <template #icon>-->
<#--            <n-icon>-->
<#--              <FaEditRegular />-->
<#--            </n-icon>-->
<#--          </template>-->
<#--          <template #default>修改</template>-->
<#--        </n-button>-->
<#--        <n-popconfirm :on-positive-click="deleteModel">-->
<#--          <div>数据无价，确认删除？</div>-->
<#--          <template #trigger>-->
<#--            <n-button type="error" :disabled="modelKeys.length < 1">-->
<#--              <template #icon>-->
<#--                <n-icon>-->
<#--                  <CarbonDelete />-->
<#--                </n-icon>-->
<#--              </template>-->
<#--              <template #default>删除</template>-->
<#--            </n-button>-->
<#--          </template>-->
<#--        </n-popconfirm>-->
<#--      </n-button-group>-->
<#--      <n-button-group class="button-group" size="small">-->
<#--        <n-button type="success" @click="importModel">-->
<#--          <template #icon>-->
<#--            <n-icon>-->
<#--              <TablerFileUpload />-->
<#--            </n-icon>-->
<#--          </template>-->
<#--          <template #default>导入</template>-->
<#--        </n-button>-->
<#--        <n-button type="info" @click="exportModel">-->
<#--          <template #icon>-->
<#--            <n-icon>-->
<#--              <TablerFileDownload />-->
<#--            </n-icon>-->
<#--          </template>-->
<#--          <template #default>导出</template>-->
<#--        </n-button>-->
<#--      </n-button-group>-->
<#--    </div>-->
<#--    <n-data-table-->
<#--      class="data-table"-->
<#--      size="small"-->
<#--      :scroll-x="1000"-->
<#--      :flex-height="true"-->
<#--      :columns="tableColumns"-->
<#--      :data="modelData"-->
<#--      :remote="true"-->
<#--      :loading="tableLoad"-->
<#--      :row-key="(row: ModelType) => row.${table.fields[0].propertyName}"-->
<#--      :checked-row-keys="modelKeys"-->
<#--      :on-update:checked-row-keys="checkRow"-->
<#--      :pagination="tablePage"-->
<#--      :on-update:page="currentPage"-->
<#--      :on-update:page-size="sizePage"-->
<#--    >-->
<#--    </n-data-table>-->
<#--  </div>-->
<#--  <n-modal-->
<#--    style="width: 856px"-->
<#--    preset="dialog"-->
<#--    :icon="modalIcon"-->
<#--    :title="modalTitle"-->
<#--    negative-text="取消"-->
<#--    positive-text="确认"-->
<#--    v-model:show="modalShow"-->
<#--    :mask-closable="false"-->
<#--    :on-positive-click="submitModal"-->
<#--  >-->
<#--    <n-form-->
<#--      ref="modelForm"-->
<#--      size="small"-->
<#--      label-placement="left"-->
<#--      label-align="right"-->
<#--      label-width="120"-->
<#--      :model="modelValue"-->
<#--      :rules="modelRules"-->
<#--    >-->
<#--      <n-grid>-->
<#--<#list table.fields as field>-->
<#--<#if !field.keyFlag>-->
<#--        <n-form-item-gi :span="12" label="${field.comment}" path="${field.propertyName}">-->
<#--<#if field.propertyType == "Long">-->
<#--          <n-input-number v-model:value="modelValue.${field.propertyName}" placeholder="">-->
<#--          </n-input-number>-->
<#--<#elseif field.propertyType == "Boolean">-->
<#--          <n-radio-group v-model:value="modelValue.${field.propertyName}" name="${field.propertyName}">-->
<#--            <n-radio-button label="是" :value="true"></n-radio-button>-->
<#--            <n-radio-button label="否" :value="false"></n-radio-button>-->
<#--          </n-radio-group>-->
<#--<#elseif field.propertyType == "Timestamp">-->
<#--          <n-date-picker-->
<#--            v-model:value="modelValue.${field.propertyName}"-->
<#--            type="datetime"-->
<#--            placeholder=""-->
<#--          >-->
<#--          </n-date-picker>-->
<#--<#else>-->
<#--          <n-input v-model:value="modelValue.${field.propertyName}" placeholder="">-->
<#--          </n-input>-->
<#--</#if>-->
<#--        </n-form-item-gi>-->
<#--</#if>-->
<#--</#list>-->
<#--        <n-form-item-gi :span="12" label="排序编号" path="orderNumber">-->
<#--          <n-input-number v-model:value="modelValue.orderNumber" placeholder="">-->
<#--          </n-input-number>-->
<#--        </n-form-item-gi>-->
<#--      </n-grid>-->
<#--    </n-form>-->
<#--  </n-modal>-->
<#--  <n-drawer-->
<#--    to=".container"-->
<#--    placement="top"-->
<#--    height="200"-->
<#--    show-mask="transparent"-->
<#--    v-model:show="drawerShow"-->
<#--  >-->
<#--    <n-drawer-content-->
<#--      body-content-style="padding: 20px;"-->
<#--      footer-style="padding: 10px;"-->
<#--    >-->
<#--      <template #default>-->
<#--        <n-form-->
<#--          size="small"-->
<#--          label-placement="left"-->
<#--          label-align="right"-->
<#--          label-width="120"-->
<#--          :model="searchItem"-->
<#--        >-->
<#--          <n-grid>-->
<#--<#list table.fields as field>-->
<#--<#if !field.keyFlag>-->
<#--            <n-form-item-gi :span="8" label="${field.comment}">-->
<#--<#if field.propertyType == "Long">-->
<#--              <n-input-number-->
<#--                v-model:value="searchItem.${field.propertyName}"-->
<#--                placeholder=""-->
<#--                :clearable="true"-->
<#--              >-->
<#--              </n-input-number>-->
<#--<#elseif field.propertyType == "Boolean">-->
<#--              <n-select-->
<#--                v-model:value="searchItem.${field.propertyName}"-->
<#--                placeholder=""-->
<#--                :clearable="true"-->
<#--                :options="[{label: "是", value: true}, {label: "否", value: false}]"-->
<#--              >-->
<#--              </n-select>-->
<#--<#elseif field.propertyType == "Timestamp">-->
<#--              <n-date-picker-->
<#--                v-model:value="searchItem.${field.propertyName}"-->
<#--                type="datetime"-->
<#--                placeholder=""-->
<#--                :clearable="true"-->
<#--              >-->
<#--              </n-date-picker>-->
<#--<#else>-->
<#--              <n-input-->
<#--                v-model:value="searchItem.${field.propertyName}"-->
<#--                placeholder=""-->
<#--                :clearable="true"-->
<#--              >-->
<#--              </n-input>-->
<#--</#if>-->
<#--            </n-form-item-gi>-->
<#--</#if>-->
<#--</#list>-->
<#--          </n-grid>-->
<#--        </n-form>-->
<#--      </template>-->
<#--      <template #footer>-->
<#--        <n-button type="info" size="small" @click="searchModel">-->
<#--          <template #icon>-->
<#--            <n-icon>-->
<#--              <CarbonSearch />-->
<#--            </n-icon>-->
<#--          </template>-->
<#--          <template #default>搜索</template>-->
<#--        </n-button>-->
<#--      </template>-->
<#--    </n-drawer-content>-->
<#--  </n-drawer>-->
<#--</template>-->

<#--<script lang="ts" setup>-->
<#--import { onMounted, reactive, ref, h } from "vue";-->
<#--import {-->
<#--  DataTableColumn,-->
<#--  PaginationProps,-->
<#--  PaginationInfo,-->
<#--  FormInst,-->
<#--  FormRules,-->
<#--  NButton,-->
<#--  NTime,-->
<#--} from "naive-ui";-->
<#--import * as XLSX from "xlsx";-->
<#--import PingIcon from "@/views/common/ping/ping-icon.vue";-->
<#--import { ${table.entityName} } from "@/http/api/${schemaName?substring(0,schemaName?length-1)}/<#if package.ModuleName?? && package.ModuleName != "">${package.ModuleName}/</#if>${controllerMappingHyphen}";-->

<#--interface ModelType {-->
<#--<#list table.fields as field>-->
<#--<#if field.propertyType == "Long">-->
<#--  ${field.propertyName}: number | null;-->
<#--<#elseif field.propertyType == "Boolean">-->
<#--  ${field.propertyName}: boolean | null;-->
<#--<#elseif field.propertyType == "Timestamp">-->
<#--  ${field.propertyName}: number | null;-->
<#--<#else>-->
<#--  ${field.propertyName}: string | null;-->
<#--</#if>-->
<#--</#list>-->
<#--  orderNumber: number | null;-->
<#--}-->

<#--const modelData = ref<Array<ModelType>>([]);-->
<#--const modelKeys = ref<Array<string>>([]);-->
<#--const modelRows = ref<Array<ModelType>>([]);-->
<#--const modelForm = ref<FormInst>();-->
<#--const modelValue = reactive<ModelType>({-->
<#--<#list table.fields as field>-->
<#--  ${field.propertyName}: null,-->
<#--</#list>-->
<#--  orderNumber: null,-->
<#--});-->
<#--const searchValue = reactive<ModelType>({-->
<#--<#list table.fields as field>-->
<#--  ${field.propertyName}: null,-->
<#--</#list>-->
<#--  orderNumber: null,-->
<#--});-->
<#--const searchItem = reactive<ModelType>({-->
<#--<#list table.fields as field>-->
<#--  ${field.propertyName}: null,-->
<#--</#list>-->
<#--  orderNumber: null,-->
<#--});-->
<#--const modelRules = reactive<FormRules>({-->
<#--<#list table.fields as field>-->
<#--<#if !field.keyFlag>-->
<#--  ${field.propertyName}: [],-->
<#--</#if>-->
<#--</#list>-->
<#--  orderNumber: [],-->
<#--});-->
<#--const tableColumns = ref<Array<DataTableColumn>>([]);-->
<#--const tablePage = reactive<PaginationProps>({-->
<#--  itemCount: 0,-->
<#--  pageSizes: [10, 15, 25, 40],-->
<#--  pageSize: 15,-->
<#--  page: 1,-->
<#--  showSizePicker: true,-->
<#--  showQuickJumper: true,-->
<#--  displayOrder: ["quick-jumper", "pages", "size-picker"],-->
<#--  prefix({ itemCount }: PaginationInfo) {-->
<#--    return `共 ${r"${itemCount}"} 条`;-->
<#--  },-->
<#--});-->
<#--const tableLoad = ref<boolean>(false);-->
<#--const modalType = ref<string>();-->
<#--const modalIcon = ref<Function>();-->
<#--const modalTitle = ref<string>();-->
<#--const modalShow = ref<boolean>(false);-->
<#--const drawerShow = ref<boolean>(false);-->

<#--/**-->
<#-- * 装载完成-->
<#-- */-->
<#--onMounted(() => {-->
<#--  loadModel();-->
<#--});-->

<#--/**-->
<#-- * 重置模型-->
<#-- */-->
<#--function resetModel() {-->
<#--<#list table.fields as field>-->
<#--  modelValue.${field.propertyName} = null;-->
<#--</#list>-->
<#--  modelValue.orderNumber = null;-->
<#--}-->

<#--/**-->
<#-- * 设置模型-->
<#-- */-->
<#--function setModel() {-->
<#--<#list table.fields as field>-->
<#--  modelValue.${field.propertyName} = modelRows.value[0].${field.propertyName};-->
<#--</#list>-->
<#--  modelValue.orderNumber = modelRows.value[0].orderNumber;-->
<#--}-->

<#--/**-->
<#-- * 提交模型-->
<#-- */-->
<#--function submitModal() {-->
<#--  modelForm.value?.validate((error) => {-->
<#--    if (error) {-->
<#--      modalShow.value = true;-->
<#--    } else {-->
<#--      if (modalType.value == "add") {-->
<#--        ${table.entityName}.insert({ data: modelValue }).then((res: ResponseResult) => {-->
<#--          if (res.code == 200) {-->
<#--            loadModel();-->
<#--          }-->
<#--        });-->
<#--      } else if (modalType.value == "edit") {-->
<#--        ${table.entityName}.update({ data: modelValue }).then((res: ResponseResult) => {-->
<#--          if (res.code == 200) {-->
<#--            loadModel();-->
<#--            modelKeys.value = [];-->
<#--            modelRows.value = [];-->
<#--          }-->
<#--        });-->
<#--      }-->
<#--    }-->
<#--  });-->
<#--}-->

<#--/**-->
<#-- * 删除模型-->
<#-- */-->
<#--function deleteModel() {-->
<#--  ${table.entityName}.delete({ data: modelKeys.value }).then((res: ResponseResult) => {-->
<#--    if (res.code == 200) {-->
<#--      loadModel();-->
<#--      modelKeys.value = [];-->
<#--      modelRows.value = [];-->
<#--    }-->
<#--  });-->
<#--}-->

<#--/**-->
<#-- * 加载模型-->
<#-- */-->
<#--function loadModel() {-->
<#--  tableLoad.value = true;-->
<#--  ${table.entityName}.page({-->
<#--    page: {-->
<#--      size: tablePage.pageSize as number,-->
<#--      current: tablePage.page as number,-->
<#--    },-->
<#--    data: { ...searchValue },-->
<#--  }).then((res: ResponseResult) => {-->
<#--    if (res.code == 200) {-->
<#--      tablePage.itemCount = res.data.total;-->
<#--      modelData.value = res.data.records;-->
<#--    }-->
<#--    tableLoad.value = false;-->
<#--  });-->
<#--}-->

<#--/**-->
<#-- * 搜索模型-->
<#-- */-->
<#--function searchModel() {-->
<#--<#list table.fields as field>-->
<#--<#if !field.keyFlag>-->
<#--  searchValue.${field.propertyName} = searchItem.${field.propertyName};-->
<#--</#if>-->
<#--</#list>-->
<#--  loadModel();-->
<#--}-->

<#--/**-->
<#-- * 导入模型-->
<#-- */-->
<#--function importModel() {-->
<#--  const input = document.createElement("input");-->
<#--  input.setAttribute("id", "importInput");-->
<#--  input.setAttribute("type", "file");-->
<#--  input.setAttribute("accept", ".xlsx,.xls");-->
<#--  input.setAttribute("style", "display:none");-->
<#--  document.body.appendChild(input);-->
<#--  input.click();-->
<#--  input.onchange = (e: any) => {-->
<#--    const fileReader = new FileReader();-->
<#--    fileReader.onload = (file: any) => {-->
<#--      const book = XLSX.read(file.target.result, {-->
<#--        type: "binary",-->
<#--        cellDates: true,-->
<#--      });-->
<#--      const sheetName = book.SheetNames[0];-->
<#--      const res: any = XLSX.utils.sheet_to_json(book.Sheets[sheetName]);-->
<#--      input.remove();-->
<#--      let data = [];-->
<#--      for (let model of res) {-->
<#--        data.push({-->
<#--<#list table.fields as field>-->
<#--<#if !field.keyFlag>-->
<#--          ${field.propertyName}: model["${field.comment}"],-->
<#--</#if>-->
<#--</#list>-->
<#--        });-->
<#--      }-->
<#--      ${table.entityName}.inserts({ data }).then((res) => {-->
<#--        if (res.code == 200) {-->
<#--          loadModel();-->
<#--        }-->
<#--      });-->
<#--    };-->
<#--    fileReader.readAsBinaryString(e.target.files[0]);-->
<#--  };-->
<#--}-->

<#--/**-->
<#-- * 导出模型-->
<#-- */-->
<#--function exportModel() {-->
<#--  ${table.entityName}.list({ data: { ...searchValue } }).then((res) => {-->
<#--    if (res.code == 200) {-->
<#--      let data = [];-->
<#--      for (let model of res.data.records) {-->
<#--        data.push({-->
<#--<#list table.fields as field>-->
<#--<#if !field.keyFlag>-->
<#--          "${field.comment}": model.${field.propertyName},-->
<#--</#if>-->
<#--</#list>-->
<#--        });-->
<#--      }-->
<#--      const book = XLSX.utils.book_new();-->
<#--      const sheet = XLSX.utils.json_to_sheet(data, {-->
<#--        header: [-->
<#--<#list table.fields as field>-->
<#--<#if !field.keyFlag>-->
<#--          "${field.comment}",-->
<#--</#if>-->
<#--</#list>-->
<#--        ]-->
<#--      });-->
<#--      XLSX.utils.book_append_sheet(book, sheet, "${table.comment}");-->
<#--      XLSX.writeFile(book, "${table.comment}.xlsx");-->
<#--    }-->
<#--  });-->
<#--}-->

<#--/**-->
<#-- * 选中行-->
<#-- */-->
<#--function checkRow(keys: Array<string>, rows: Array<ModelType>) {-->
<#--  modelKeys.value = keys;-->
<#--  modelRows.value = rows;-->
<#--}-->

<#--/**-->
<#-- * 切换页面-->
<#-- */-->
<#--function currentPage(current: number) {-->
<#--  tablePage.page = current;-->
<#--  loadModel();-->
<#--}-->

<#--/**-->
<#-- * 改变页面大小-->
<#-- */-->
<#--function sizePage(size: number) {-->
<#--  tablePage.pageSize = size;-->
<#--  loadModel();-->
<#--}-->

<#--/**-->
<#-- * 显示模态框-->
<#-- */-->
<#--function showModal(type: string) {-->
<#--  modalType.value = type;-->
<#--  if (modalType.value == "add") {-->
<#--    modalIcon.value = () => h(PingIcon, { icon: "FaPlusSquareRegular" });-->
<#--    modalTitle.value = "添加";-->
<#--    resetModel();-->
<#--  } else if (modalType.value == "edit") {-->
<#--    modalIcon.value = () => h(PingIcon, { icon: "FaEditRegular" });-->
<#--    modalTitle.value = "修改";-->
<#--    setModel();-->
<#--  }-->
<#--  modalShow.value = true;-->
<#--}-->

<#--/**-->
<#-- * 设置表头-->
<#-- */-->
<#--tableColumns.value = [-->
<#--  { type: "selection", width: 40 },-->
<#--<#list table.fields as field>-->
<#--<#if !field.keyFlag>-->
<#--<#if field.propertyType == "Long">-->
<#--  { title: "${field.comment}", key: "${field.propertyName}", align: "center", width: 100 },-->
<#--<#elseif field.propertyType == "Boolean">-->
<#--  {-->
<#--    title: "${field.comment}",-->
<#--    key: "${field.propertyName}",-->
<#--    align: "center",-->
<#--    width: 100,-->
<#--    render(row: any) {-->
<#--      const type = row.${field.propertyName} ? "success" : "error";-->
<#--      const text = row.${field.propertyName} ? "是" : "否";-->
<#--      return h(-->
<#--        NButton,-->
<#--        { type, size: "small", secondary: true, focusable: false },-->
<#--        { default: () => text }-->
<#--      );-->
<#--    },-->
<#--  },-->
<#--<#elseif field.propertyType == "Timestamp">-->
<#--  {-->
<#--    title: "${field.comment}",-->
<#--    key: "${field.propertyName}",-->
<#--    align: "center",-->
<#--    width: 100,-->
<#--    render(row: any) {-->
<#--      if (row.${field.propertyName}) {-->
<#--        return h(NTime, {-->
<#--          time: new Date(row.${field.propertyName}),-->
<#--          format: "yyyy-MM-dd HH:mm:ss",-->
<#--        });-->
<#--      } else {-->
<#--        return "";-->
<#--      }-->
<#--    },-->
<#--  },-->
<#--<#else>-->
<#--  { title: "${field.comment}", key: "${field.propertyName}", align: "center", width: 100 },-->
<#--</#if>-->
<#--</#if>-->
<#--</#list>-->
<#--  { title: "排序编号", key: "orderNumber", align: "center" },-->
<#--];-->
<#--</script>-->

<#--<style lang="scss" scoped>-->
<#--.container {-->
<#--  width: 100%;-->
<#--  height: 100%;-->
<#--  background-color: #ffffff;-->
<#--  display: flex;-->
<#--  flex-direction: column;-->
<#--  justify-content: flex-start;-->
<#--  align-items: flex-start;-->
<#--  position: relative;-->

<#--  .handle {-->
<#--    width: 100%;-->
<#--    height: 38px;-->
<#--    display: flex;-->
<#--    flex-direction: row;-->
<#--    justify-content: flex-end;-->
<#--    align-items: center;-->

<#--    .button-group {-->
<#--      margin-right: 5px;-->
<#--    }-->
<#--  }-->

<#--  .data-table {-->
<#--    height: calc(100% - 38px);-->
<#--  }-->
<#--}-->
<#--</style>-->
